#include "ClientModule.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *deletedClient_model;
extern ClientSqlTableModel *client_model;
extern QTableView *client_view;

ClientModule::ClientModule(QWidget *parent) :
    QMainWindow(parent)
{
    client_toolbar = new CustomModulesToolbar(this);
    CreateClientToolBar();
    DeleteClientToolBar();
    EditClientToolBar();
    DeletedClientListToolBar();
    UpdateClientListToolBar();
    PrintClientToolBar();
    PrintListadoInternoToolBar();
    addToolBar(client_toolbar);

    // Modelo correspondiente a la tabla "cliente"
    client_model = new ClientSqlTableModel(this, enjoylifedb);
    client_model->setTable("cliente");
    client_model->setEditStrategy(ClientSqlTableModel::OnFieldChange);

    // Vista del modelo definido anteriormente
    client_view = new QTableView(this);
    UpdateClientListBtn();
    setCentralWidget(client_view);

    // Modelo correspondiente a la tabla "cliente eliminado"
    deletedClient_model = new ClientSqlTableModel(this, enjoylifedb);

    QWidget* widget_main = new QWidget();
    QWidget* widget_derecho = new QWidget();

    QGridLayout *grid_lay = new QGridLayout();
    QGridLayout *grid_derecho = new QGridLayout();

    QGroupBox *group_father = new QGroupBox("Filtros y Búsquedas",this);
    QFormLayout *form_date = new QFormLayout;

    QLabel *date_label = new QLabel("Filtrar por Fecha Alta",0);
    date_label->setFixedWidth(190);
    date_label->setFixedHeight(20);
    date_label->setAlignment(Qt::AlignCenter);
    date_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(date_label);

    created_today = new QRadioButton("Creados hoy",0);
    connect(created_today,SIGNAL(clicked()),this,SLOT(ViewCreatedToday()));
    form_date->addRow(created_today);

    created_last_month = new QRadioButton("El mes pasado",0);
    connect(created_last_month,SIGNAL(clicked()),this,SLOT(ViewCreatedLastMonth()));
    form_date->addRow(created_last_month);

    created_current_month = new QRadioButton("El corriente mes",0);
    connect(created_current_month,SIGNAL(clicked()),this,SLOT(ViewCreatedCurrentMonth()));
    form_date->addRow(created_current_month);

    created_last_year = new QRadioButton("El año pasado",0);
    connect(created_last_year,SIGNAL(clicked()),this,SLOT(ViewCreatedLastYear()));
    form_date->addRow(created_last_year);

    created_current_year = new QRadioButton("El corriente año",0);
    connect(created_current_year,SIGNAL(clicked()),this,SLOT(ViewCreatedCurrentYear()));
    form_date->addRow(created_current_year);

    QLabel *filter_label = new QLabel("Búsqueda Rápida",0);
    filter_label->setFixedWidth(190);
    filter_label->setFixedHeight(20);
    filter_label->setAlignment(Qt::AlignCenter);
    filter_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(filter_label);

    find_razon_social = new QRadioButton("Razón Social",0);
    connect(find_razon_social,SIGNAL(clicked()),this,SLOT(FindRazonSocial()));
    form_date->addRow(find_razon_social);

    find_responsable = new QRadioButton("Responsable",0);
    connect(find_responsable,SIGNAL(clicked()),this,SLOT(FindResponsable()));
    form_date->addRow(find_responsable);

    find_fecha_alta = new QRadioButton("Fecha Alta",0);
    connect(find_fecha_alta,SIGNAL(clicked()),this,SLOT(FindFechaAlta()));
    form_date->addRow(find_fecha_alta);

    // Doble click sobre un cliente abre la edición.
    connect(client_view,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(EditClientBtn()));

    find_line = new QLineEdit(this);
    find_line->setFixedWidth(190);
    find_line->setEnabled(false);
    form_date->addRow(find_line);

    //
    QPixmap SITIimage("://Images/SITI-Soft_Logo.png");
    QLabel *SITILabel = new QLabel("",0);
    SITILabel->setPixmap(SITIimage);
    SITILabel->setFixedHeight(225);
    SITILabel->setAlignment(Qt::AlignCenter);

    group_father->setLayout(form_date);
    group_father->setFixedWidth(210);

    grid_derecho->addWidget(group_father,0,0);
    grid_derecho->addWidget(SITILabel,1,0);
    widget_derecho->setFixedWidth(220);
    widget_derecho->setLayout(grid_derecho);

    grid_lay->addWidget(client_view,0,0);
    grid_lay->addWidget(widget_derecho,0,1);

    widget_main->setLayout(grid_lay);
    setCentralWidget(widget_main);

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), client_view);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AddClientBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    QShortcut* shortcutBaja = new QShortcut(QKeySequence(QKeySequence::Delete), client_view);
    connect(shortcutBaja, SIGNAL(activated()), this, SLOT(DeleteClientBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), client_view);
    connect(shortcutModif, SIGNAL(activated()), this, SLOT(EditClientBtn()));
    // Definición de acceso directo para abrir el módulo de clientes eliminados mediante la combinacion de teclas "Ctrl + E".
    QShortcut* shortcutClEliminados = new QShortcut(QKeySequence("Ctrl+E"), this);
    connect(shortcutClEliminados, SIGNAL(activated()), this, SLOT(DeletedClientListBtn()));
    // Definición de acceso directo para actualizr la lista mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(UpdateClientListBtn()));
    // Definición de acceso directo para lista personalizada de clientes mediante la combinacion de teclas "Ctrl + Q".
    QShortcut* shortcutImprimir = new QShortcut(QKeySequence("Ctrl+Q"), this);
    connect(shortcutImprimir, SIGNAL(activated()), this, SLOT(PrintClientBtn()));
    // Definición de acceso directo para imprimir listado rapido de clientes mediante la combinacion de teclas "Ctrl + P".
    QShortcut* shortcutImprimir2 = new QShortcut(QKeySequence("Ctrl+P"), this);
    connect(shortcutImprimir2, SIGNAL(activated()), this, SLOT(PrintInternListBtn()));
}

/*
 *
 */
void ClientModule::CreateVerticalLayout()
{
    QGroupBox *group = new QGroupBox("Opciones",this);
    QFormLayout *form = new QFormLayout;
    form->addRow("pepe",new QRadioButton);
    group->setLayout(form);
}

void ClientModule::ViewCreatedToday()
{
    find_line->setEnabled(false);
    find_line->clear();
    QDate date;
    QString format = "yyyy-MM-dd";
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString fecha = date.toString(format);
    if (created_today->isChecked()) {
        enjoylifedb.transaction();
        filterClient = "fecha_alta = '" + fecha + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ClientModule::ViewCreatedLastMonth()
{
    find_line->setEnabled(false);
    find_line->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio;
    QString mes;
    if (date.currentDate().month() == 1) {
        date.setDate(date.currentDate().year() - 1, 12, date.currentDate().day());
        anio = date.toString(formatYear);
        mes = date.toString(formatMonth);
    }
    else {
        date.setDate(date.currentDate().year(), date.currentDate().month() - 1, date.currentDate().day());
        anio = date.toString(formatYear);
        mes = date.toString(formatMonth);
    }
    if (created_last_month->isChecked()) {
        enjoylifedb.transaction();
        filterClient = "date_part('year',fecha_alta)='" + anio + "'";
        filterClient = filterClient + " and date_part('month',fecha_alta)='" + mes + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ClientModule::ViewCreatedCurrentMonth()
{
    find_line->setEnabled(false);
    find_line->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio;
    QString mes;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);
    if (created_current_month->isChecked()) {
        enjoylifedb.transaction();
        filterClient = "date_part('year',fecha_alta)='" + anio + "'";
        filterClient = filterClient + " and date_part('month',fecha_alta)='" + mes + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ClientModule::ViewCreatedLastYear()
{
    find_line->setEnabled(false);
    find_line->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString anio;
    date.setDate(date.currentDate().year() - 1, date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    if (created_last_year->isChecked()) {
        enjoylifedb.transaction();
        filterClient = "date_part('year',fecha_alta)='" + anio + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ClientModule::ViewCreatedCurrentYear()
{
    find_line->setEnabled(false);
    find_line->clear();
    QDate date;
    QString formatYear = "yyyy";
    QString anio;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    anio = date.toString(formatYear);
    if (created_current_year->isChecked()) {
        enjoylifedb.transaction();
        filterClient = "date_part('year',fecha_alta)='" + anio + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModel();
    }
}

void ClientModule::FindRazonSocial()
{
    if (find_razon_social->isChecked()) {
        find_responsable->setChecked(false);
        find_fecha_alta->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterResponsable()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
    }
    else
        find_line->setEnabled(false);
}

void ClientModule::FilterRazonSocial()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filterClient = "razon_social ilike '%" + find_line->text() + "%'";
        filterClient.append(" and estado is null");
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateClientListBtn();
}

void ClientModule::FindResponsable()
{
    if (find_responsable->isChecked()) {
        find_razon_social->setChecked(false);
        find_fecha_alta->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterResponsable()));
    }
    else
        find_line->setEnabled(false);
}

void ClientModule::FilterResponsable()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filterClient = "responsable ilike '%" + find_line->text() + "%'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateClientListBtn();
}

void ClientModule::FindFechaAlta()
{
    if (find_fecha_alta->isChecked()) {
        find_razon_social->setChecked(false);
        find_responsable->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterResponsable()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
    }
    else
        find_line->setEnabled(false);
}

void ClientModule::FilterFechaAlta()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filterClient = "fecha_alta = '" + find_line->text() + "'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filterClient);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientListBtn();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModel();
        }
    }
    else
        UpdateClientListBtn();
}

/*
 * Se agrega el Botón crear cliente a la toolbar
 */
void ClientModule::CreateClientToolBar()
{
    new_client = new QAction("Nuevo Cliente",this);
    new_client->setIcon(QIcon("://Icons/BarraHerramientas/alta48.png"));
    new_client->setIconText("Nuevo Cliente");
    new_client->setToolTip("Crear nuevo cliente");
    connect(new_client,SIGNAL(triggered()),this,SLOT(AddClientBtn()));

    client_toolbar->addAction(new_client);
}

/*
 * Se agrega el Botón eliminar cliente a la toolbar
 */
void ClientModule::DeleteClientToolBar()
{
    delete_client = new QAction("Eliminar Cliente",this);
    delete_client->setIcon(QIcon("://Icons/BarraHerramientas/baja48.png"));
    delete_client->setIconText("Eliminar Cliente");
    delete_client->setToolTip("Eliminar cliente");
    connect(delete_client,SIGNAL(triggered()),this,SLOT(DeleteClientBtn()));

    client_toolbar->addAction(delete_client);
}

/*
 * Se agrega el Botón editar cliente a la toolbar
 */
void ClientModule::EditClientToolBar()
{
    edit_client = new QAction("Editar Cliente",this);
    edit_client->setIcon(QIcon("://Icons/BarraHerramientas/modificar48.png"));
    edit_client->setIconText("Editar Cliente");
    edit_client->setToolTip("Editar cliente");
    connect(edit_client,SIGNAL(triggered()),this,SLOT(EditClientBtn()));

    client_toolbar->addAction(edit_client);
}

/*
 * Se agrega el botón actualizar lista de clientes a la toolbar.
 */
void ClientModule::UpdateClientListToolBar()
{
    update_clientList = new QAction("Actualizar Listado", this);
    update_clientList->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    update_clientList->setIconText("Actualizar Listado de Clietes");
    update_clientList->setToolTip("Actualiza la lista de clientes");
    connect(update_clientList,SIGNAL(triggered()),this,SLOT(UpdateClientListBtn()));

    client_toolbar->addAction(update_clientList);
    client_toolbar->addSeparator();
}

/*
 * Se agrega el Botón imprimir clientes a la toolbar
 */
void ClientModule::PrintClientToolBar()
{
    print_client = new QAction("Imprimir", this);
    print_client->setIcon(QIcon("://Icons/BarraHerramientas/imprimir48.png"));
    print_client->setIconText("Imprimir Listado Clientes");
    print_client->setToolTip("Imprimir Listado Clientes");
    connect(print_client,SIGNAL(triggered()),this,SLOT(PrintClientBtn()));

    client_toolbar->addAction(print_client);
}

void ClientModule::PrintListadoInternoToolBar()
{
    print_intern_client = new QAction("Imprimir Listado Interno", this);
    print_intern_client->setIcon(QIcon("://Icons/BarraHerramientas/listado48.png"));
    print_intern_client->setIconText("Imprimir Listado Interno");
    print_intern_client->setToolTip("Imprimir Listado Interno de Clientes");
    connect(print_intern_client,SIGNAL(triggered()),this,SLOT(PrintInternListBtn()));

    client_toolbar->addAction(print_intern_client);
}

/*
 * Se agrega el botón listado de clientes eliminados a la toolbar
 */
void ClientModule::DeletedClientListToolBar()
{
    deleted_client_list = new QAction("Clientes Eliminados", this);
    deleted_client_list->setIcon(QIcon("://Icons/BarraHerramientas/carpetaDeEliminados48.png"));
    deleted_client_list->setIconText("Clientes Eliminados");
    deleted_client_list->setToolTip("Listar Clientes Eliminados");
    connect(deleted_client_list,SIGNAL(triggered()),this,SLOT(DeletedClientListBtn()));

    client_toolbar->addAction(deleted_client_list);
    client_toolbar->addSeparator();
}

/*
 * Lanzamiento del formulario para agregar ciente.
 */
void ClientModule::AddClientBtn()
{
    NewClient *new_client_form = new NewClient();
    new_client_form->show();
    CorrectViewOfModel();
}

/*
 * Permite seleccionar y eliminar un cliente.
 */
void ClientModule::DeleteClientBtn()
{
    QModelIndexList selection;
    if (!(client_view->currentIndex().row() == -1)) {
        selection.append(client_view->currentIndex());
    }

    if (!selection.empty()) {
        QModelIndex idIndex = selection.first();
        QString rs = idIndex.sibling(idIndex.row(), 1).data().toString();

        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Eleminar Cliente"),
                                       tr("¿Está seguro que quiere "
                                          "eliminar el cliente '%1'?").arg(rs),
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            // Antes de eliminar el cliente se lo agrega a la tabla cliente_eliminado
            enjoylifedb.transaction();
            deletedClient_model->clear();
            deletedClient_model->setTable("cliente_eliminado");
            if (!(deletedClient_model->select())) {
                QString error = deletedClient_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar la tabla de clientes eliminados, "
                                                        "intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            QDate date;
            date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
            QTime time;
            QSqlRecord record;
            QSqlField rsField(QStringLiteral("razon_social"), QVariant::String);
            rsField.setValue(client_model->index(idIndex.row(),1).data().toString());
            record.append(rsField);
            persona = client_model->index(idIndex.row(),1).data().toString();
            QSqlField respField(QStringLiteral("responsable"), QVariant::String);
            respField.setValue(client_model->index(idIndex.row(),2).data().toString());
            record.append(respField);
            QSqlField fbField(QStringLiteral("fecha_baja"), QVariant::Date);
            fbField.setValue(date.currentDate());
            record.append(fbField);
            QSqlField hbField(QStringLiteral("hora_baja"), QVariant::Time);
            hbField.setValue(time.currentTime());
            record.append(hbField);
            deletedClient_model = new QSqlRelationalTableModel(this, enjoylifedb);
            deletedClient_model->setTable("cliente_eliminado");
            enjoylifedb.transaction();
            if (!(deletedClient_model->insertRecord(-1, record))) {
                QString error = deletedClient_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar el cliente en la tabla de clientes eliminados, "
                                                        "intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            // Backup de seguridad previo a eliminar un cliente
            BackupBeforeDeleteClient();
            // Se actualiza listado de clientes.
            UpdateClientListBtn();
            CorrectViewOfModel();
            // Se da de baja el cliente seleccionado de la tabla cliente
//            enjoylifedb.transaction();
//            if (!client_model->removeRow(idIndex.row())) {
//                QMessageBox::critical(this,"Error!", "No se pudo eliminar el cliente, vuelva a intentarlo.");
//                enjoylifedb.rollback();
//                return;
//            }
            enjoylifedb.transaction();
            QSqlQuery *query = new QSqlQuery(enjoylifedb);
            QString stm = "update cliente set estado = 'BAJA' where razon_social = '" + persona + "'";
            if (! query->exec(stm)) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar el cliente, "
                                      "intentelo nuevamente || " + query->lastError().text());
                enjoylifedb.rollback();
                return;
            }
            // Se edita tabla persona con el cambio realizado en cliente.
            enjoylifedb.transaction();
            QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
            QString stm2 = "update persona set estado = 'BAJA' where persona = '" + persona + "'";
            if (! query2->exec(stm2)) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar el cliente de la tabla persona, "
                                      "intentelo nuevamente || " + query2->lastError().text());
                enjoylifedb.rollback();
                return;
            }

            enjoylifedb.commit();
            QMessageBox::information(this,"Exito!", "El cliente fue eliminado correctamente.",
                                     QMessageBox::Ok);
        }
    } else {
        QMessageBox::warning(this, tr("Eleminar Cliente"),
                             tr("La operación no se puede concretar."
                                "\nNingún cliente ha sido seleccionado."));
    }

    // Se actualiza listado de clientes.
    UpdateClientListBtn();
    CorrectViewOfModel();
}

/*
 * Lanzamiento del formulario para modificar los datos de un ciente.
 */
void ClientModule::  EditClientBtn()
{
    // Se controla para el caso que no existan clientes cargados.
    if (client_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay clientes disponibles.");
        return;
    }

    int selection = -1;
    if (!(client_view->currentIndex().row() == -1)) {
        selection = client_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        EditClient *edit_client_form = new EditClient();
        edit_client_form->GetClientInfo(selection);
        edit_client_form->show();

        enjoylifedb.commit();
        CorrectViewOfModel();
    } else {
        QMessageBox::warning(this, tr("Modificar Cliente"),
                             tr("La operación no se puede concretar."
                                "\nNingún cliente ha sido seleccionado."));
    }
}

/*
 * Lanzamiento de la acción de actualizar la lista de clientes manualmente.
 */
void ClientModule::UpdateClientListBtn()
{
    QString filtro = "estado is null";
    client_model->setTable("cliente");
    client_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModel();
}

/*
 * Lanzamiento de opciones para imprimir el listado de cliente de client_view
 */
void ClientModule::PrintClientBtn()
{
//    if (!(client_model->rowCount() != 0)) {
        ReportClientGenerator *report_conf = new ReportClientGenerator();
        report_conf->show();
//    }
//    else {
//        QMessageBox::information(this,"Advertencia!","No existe ningún cliente para reportar");
//        return;
        //    }
}

void ClientModule::PrintInternListBtn()
{
    ClientReportIntern * intern_rep = new ClientReportIntern();
    intern_rep->show();
}

void ClientModule::DeletedClientListBtn()
{
    DeletedClient *deleted_client_form = new DeletedClient();
    deleted_client_form->show();
}

/*
 *  Organiza de manera adecuada la vista del modulo cliente
 */
void ClientModule::CorrectViewOfModel()
{
    client_model->setHeaderData(0, Qt::Horizontal, "Nro. Cliente");
    client_model->setHeaderData(1, Qt::Horizontal, "Razón Social");
    client_model->setHeaderData(2, Qt::Horizontal, "Responsable");
    client_model->setHeaderData(4, Qt::Horizontal, "Fecha Alta");
//    client_model->setHeaderData(5, Qt::Horizontal, "Calle");
//    client_model->setHeaderData(6, Qt::Horizontal, "Nro.");
//    client_model->setHeaderData(7, Qt::Horizontal, "Piso");
//    client_model->setHeaderData(8, Qt::Horizontal, "Depto.");
//    client_model->setHeaderData(9, Qt::Horizontal, "Barrio");
//    client_model->setHeaderData(10, Qt::Horizontal, "Ciudad");
//    client_model->setHeaderData(11, Qt::Horizontal, "Provincia");
    client_model->setHeaderData(12, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(13, Qt::Horizontal, "Telefono");
    client_model->setHeaderData(14, Qt::Horizontal, "Tipo Tel.");
    client_model->setHeaderData(15, Qt::Horizontal, "Tel. Altern.");
    client_model->setHeaderData(16, Qt::Horizontal, "E-mail");
    client_model->setHeaderData(17, Qt::Horizontal, "E-mail Altern.");
//    client_model->setHeaderData(18, Qt::Horizontal, "Usuario cpanel");
//    client_model->setHeaderData(19, Qt::Horizontal, "Pass cpanel");
//    client_model->setHeaderData(20, Qt::Horizontal, "Registrante NIC");
//    client_model->setHeaderData(21, Qt::Horizontal, "E-mail Regist. NIC");
//    client_model->setHeaderData(22, Qt::Horizontal, "Fecha Alta NIC");
//    client_model->setHeaderData(23, Qt::Horizontal, "Fecha Vto. NIC");

    // Vista del modelo definido anteriormente
    client_view->setModel(client_model);
    client_view->sortByColumn(1, Qt::SortOrder());
    client_view->setSortingEnabled(true);
    client_view->setAlternatingRowColors(true);
    client_view->setGridStyle(Qt::SolidLine);
    client_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    client_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);


    client_view->hideColumn(3);
    client_view->hideColumn(5);
    client_view->hideColumn(6);
    client_view->hideColumn(7);
    client_view->hideColumn(8);
    client_view->hideColumn(9);
    client_view->hideColumn(10);
    client_view->hideColumn(11);
    client_view->hideColumn(18);
    client_view->hideColumn(19);
    client_view->hideColumn(20);
    client_view->hideColumn(21);
    client_view->hideColumn(22);
    client_view->hideColumn(23);
}

void ClientModule::BackupBeforeDeleteClient()
{
    QString nombreArchivo = "EnjoyLifeDB-";
    QString usuario = enjoylifedb.userName();
    QDate date;
    QString formatoFecha = "ddMMyyyy";
    QString fecha = date.currentDate().toString(formatoFecha);
    QTime time;
    QString formatoTime = "hhmmss";
    QString hora = time.currentTime().toString(formatoTime);
    QString extension = ".backup";
    QString idArchivo = nombreArchivo + usuario + "-" + fecha + "-" + hora + extension;

    QDir directorio;
    QString dir = directorio.currentPath() + "/BackupDB/AntesDeEliminar/" + usuario + "/" + fecha + "/";
    directorio.setPath(dir);
    QString dirArchivo = directorio.absolutePath() + "/" + idArchivo;

    if (!directorio.exists())
        directorio.mkpath(dir);

    QStringList argumentosDump;
    QProcess *procDump = new QProcess;
    procDump->setProgram("pg_dump");
    argumentosDump << "-U" << "postgres" << "-w" << "-d" << enjoylifedb.databaseName() << "-Fc" << "-f" << dirArchivo;
    procDump->setArguments(argumentosDump);
    procDump->execute(procDump->program(), procDump->arguments());
    if (procDump->exitCode() > 1) {
        QMessageBox::critical(this,"Aviso!", tr("Error al intentar respaldar la base de datos antes de eliminar el cliente. Error: %1").arg(procDump->errorString()));
        return;
    }
    QMessageBox::information(this,"Exito!", tr("Se relizó un respaldo de la base de datos previo a la eliminación del cliente."));
}
